<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Generator</title>
</head>
<body>
<script>
    /*
     * Generator 是一个迭代器生成函数, 其返回值是一个迭代器(Iterator), 可用于异步调用
     *
     * 语法:
     *  在function后面, 函数名之前 加一个 *
     *  函数内部 有一个 yield 表达式.
     *
     *  调用Generator函数和调用普通函数一样, 在函数名后面加上()就可以执行
     *  但是Generator函数不会像普通函数一样立即执行, 而是返回一个指向内部状态的指针对象.
     *  必须调用遍历器对象的next方法，使得指针移向下一个状态。即：每次调用next方法，内部指针就从函数头部或上一次停下来的地方开始执行，直到遇到下一个yield表达式（或return语句）为止。

     Generator 函数是分段执行的，yield表达式是暂停执行的标记，而next方法可以恢复执行。
     *
     *
     *
     *
     *
     * */

    {
        /*function* fn() { // 定义一个Generator函数
            console.log("Generator函数内部");
            yield 'hello';
            yield 'world';
            return 'end';
        }

        let f = fn();
        console.log(f);
        console.log(f.next());//{value: "hello", done: false}
        console.log(f.next());//{value: "world", done: false}
        console.log(f.next());//{value: "end", done: true}*/
    }

    {
        function* fn() { // 定义一个Generator函数
            yield '1';
            yield '2';
            yield '3';
            yield '4';
            return 'end';
        }

        let f = fn();

        console.log(f);
        console.log(f.next());//1
        console.log(f.next());//2
        console.log(f.next());//3
        console.log(f.next());//4
        console.log(f.next());//end
        for (let v of f) {
            console.log("v------", v)
        }

     /*   let obj = {};
        obj.name = [Symbol.iterator]"obj";

        for(var i of obj){
            console.log(i)   //报错
        }*/
    }
    {
        function * myGenerator(num) {
            console.log(num);

            let a = yield;

            console.log(a);

            let b = yield;

            console.log(b);
        }

        let myIr = myGenerator(10);
        myIr.next(); //1 //第一个next的传参没有任何意义
        myIr.next(20); //20
        myIr.next(30); //30
    }


</script>
</body>
</html>